//
// Created by LiuYou on 2021/8/1.
//

#ifndef MODERNCPP_WIDGET_HPP
#define MODERNCPP_WIDGET_HPP


#include <memory>
#include <ostream>


namespace Widgets {
    class Widget {
    public:
        const std::string& getName() const;

        const std::vector<double>& getData() const;

    public:
        Widget(const std::string& name, const std::vector<double>& data);

    public:
        friend std::ostream& operator<<(std::ostream& os, const Widget& widget);

    public:
        Widget();

        virtual ~Widget();

        Widget(Widget&& rhs) noexcept;

        Widget& operator=(Widget&& rhs) noexcept;

        // 拷贝构造和拷贝赋值不像移动构造和移动赋值那样编译器生成就可以了, 而是需要我们自己写。
        // 因为使用默认的编译器生成的是仅仅拷贝std::unique_ptr(即, 浅拷贝),
        // 而我们希望的则是拷贝指针所指向的内容(即, 深拷贝)。
        Widget(const Widget& rhs);

        Widget& operator=(const Widget& rhs);

    private:
        class Impl;

        std::unique_ptr<Impl> pImpl;

    };

}


#endif //MODERNCPP_WIDGET_HPP
